﻿/* *********************************************
 * Crypto libary : SecureFile module
 * Christiaan Rakowski 20110825
 * This module provides an adition abstaction and is used to encrypt and decrypt files
 * ********************************************/

using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace CryptoCs
{
	/// <summary>
	/// Summary description for SecureFile
	/// </summary>
	public class SecureFile
	{
		/// <summary>
		/// Secret master key, for ease of use. Must be 64 bits. (8 chars)
		/// </summary>
		private static readonly string MasterKey = "A$b*ls5#";
		/// <summary>
		/// Function to generate a 64 bits key.
		/// </summary>
		/// <returns>The generated 64 bits key</returns>
		public static string GenerateKey()
		{
			// Create an instance of Symetric Algorithm. Key and IV is generated automatically.
			DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

			// Use the Automatically generated key for Encryption. 
			return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
		}
		public static void EncryptFile(string sInputFilename, string sOutputFilename, string sKey)
		{
			FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

			FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);
			DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
			DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
			DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
			ICryptoTransform desencrypt = DES.CreateEncryptor();
			CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

			byte[] bytearrayinput = new byte[fsInput.Length];
			fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
			cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
			cryptostream.Close();
			fsInput.Close();
			fsEncrypted.Close();
		}
		public static void EncryptFile(string sInputFilename, string sOutputFilename)
		{
			EncryptFile(sInputFilename, sOutputFilename, MasterKey);
		}
		public static void EncryptFile(ref string data, string sOutputFilename, string sKey)
		{
			FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);
			DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
			DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
			DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
			ICryptoTransform desencrypt = DES.CreateEncryptor();
			CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

			cryptostream.Write(Encoding.UTF8.GetBytes(data), 0, data.Length);
			cryptostream.Close();
			fsEncrypted.Close();
		}
		public static void EncryptFile(ref string data, string sOutputFilename)
		{
			EncryptFile(ref data, sOutputFilename, MasterKey);
		}
		public static void DecryptFile(string sInputFilename, string sOutputFilename, string sKey)
		{
			DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
			//A 64 bit key and IV is required for this provider.
			//Set secret key For DES algorithm.
			DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
			//Set initialization vector.
			DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

			//Create a file stream to read the encrypted file back.
			FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);
			//Create a DES decryptor from the DES instance.
			ICryptoTransform desdecrypt = DES.CreateDecryptor();
			//Create crypto stream set to read and do a 
			//DES decryption transform on incoming bytes.
			CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
			//Print the contents of the decrypted file.
			StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
			fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
			fsDecrypted.Flush();
			fsDecrypted.Close();
		}
		public static void DecryptFile(string sInputFilename, string sOutputFilename)
		{
			DecryptFile(sInputFilename, sOutputFilename, MasterKey);
		}
		public static void DecryptFile(out string data, string sInputFilename, string sKey)
		{
			DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
			//A 64 bit key and IV is required for this provider.
			//Set secret key For DES algorithm.
			DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
			//Set initialization vector.
			DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

			//Create a file stream to read the encrypted file back.
			FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);
			//Create a DES decryptor from the DES instance.
			ICryptoTransform desdecrypt = DES.CreateDecryptor();
			//Create crypto stream set to read and do a 
			//DES decryption transform on incoming bytes.
			CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
			//Print the contents of the decrypted file.
			data = new StreamReader(cryptostreamDecr).ReadToEnd();
		}
		public static void DecryptFile(out string data, string sInputFilename)
		{
			DecryptFile(out data, sInputFilename, MasterKey);
		}
	}
}
